package com.zx.mes.senior.thread;

import lombok.extern.java.Log;
import org.junit.Test;

import java.util.concurrent.FutureTask;

/**
 * 多线程测试
 *
 * @author huayunlong
 * @date 2018-8-31
 */
@Log
public class ThreadTest {

    /**
     * 一个进程是一个独立的运行环境,可以看作一个程序或者一个应用,而线程是在进程中执行的一个任务
     * 线程是进程的子集,一个进程可以有多个线程,每条线程并行执行不同的任务,
     * 不同的进程使用不同的内存空间,每个线程都有单独的栈内存用来存数据
     *
     * 创建线程的两方式:一继承,另一种实现
     */
    @Test
    public void test() {

        /// 继承
        new DemoThread().start();

        /// 实现方式
        new Thread(() -> log.info("demo runable")).start();
    }

    @Test
    public void test2(){
        /// lambda 一般不这么写
        new Thread(new FutureTask<>(()->{
            log.info("callAble");
            return "callable";
        })).start();
    }

    /**
     * FutureTask 是为了弥补Thread的不足而设计,它可以主程序员准确的知道线程什么时候执行完成
     * 并获得线程执行完成后返回的结果.
     * FutureTask 是一种可以取消息的异步计算任务,它的计算通过Callable实现,
     * 等价于携带结果 的Runable,并且有三个状态:等待,运行和完成
     * 完成包括所有计算以任意的方式结束,包括正常的结束,取消和异常
     */
    @Test
    public void test3(){
        FutureTask<String> task = new FutureTask<>(() -> {
            log.info("test callable");
            return "test callable";
        });

        Thread thread = new Thread(task);
        thread.start();
//        task.cancel(true);
    }
}
